using System;
using System.ComponentModel;
using System.Globalization;
using Microsoft.WowAddonStudio.FrameXml.Serialization.LayoutFrames;

namespace Microsoft.WowAddonStudio.FrameXml.Serialization.TypeConverters
{
	public class TextureExpandableObjectConverter : ExpandableObjectConverter
	{
        /// <summary>
        /// Returns whether this converter can convert an object of the given type to the type of this converter, using the specified context.
        /// </summary>
        /// <param name="context">An <see cref="T:System.ComponentModel.ITypeDescriptorContext"/> that provides a format context.</param>
        /// <param name="sourceType">A <see cref="T:System.Type"/> that represents the type you want to convert from.</param>
        /// <returns>
        /// true if this converter can perform the conversion; otherwise, false.
        /// </returns>
	    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
	    {
            if (sourceType == typeof(String))
                return true;

            return base.CanConvertFrom(context, sourceType);
	    }

        /// <summary>
        /// Returns whether this converter can convert the object to the specified type, using the specified context.
        /// </summary>
        /// <param name="context">An <see cref="T:System.ComponentModel.ITypeDescriptorContext"/> that provides a format context.</param>
        /// <param name="destinationType">A <see cref="T:System.Type"/> that represents the type you want to convert to.</param>
        /// <returns>
        /// true if this converter can perform the conversion; otherwise, false.
        /// </returns>
	    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
	    {
            if (destinationType == typeof(Texture))
                return true;

            return base.CanConvertTo(context, destinationType);
	    }

        /// <summary>
        /// Converts the given object to the type of this converter, using the specified context and culture information.
        /// </summary>
        /// <param name="context">An <see cref="T:System.ComponentModel.ITypeDescriptorContext"/> that provides a format context.</param>
        /// <param name="culture">The <see cref="T:System.Globalization.CultureInfo"/> to use as the current culture.</param>
        /// <param name="value">The <see cref="T:System.Object"/> to convert.</param>
        /// <returns>
        /// An <see cref="T:System.Object"/> that represents the converted value.
        /// </returns>
        /// <exception cref="T:System.NotSupportedException">
        /// The conversion cannot be performed.
        /// </exception>
	    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
	    {
            if (value is String)
            {
                var textureValue = (string)value;

                if (!String.IsNullOrEmpty(textureValue))
                    return new Texture {File = textureValue};

                return null;
            }

            return base.ConvertFrom(context, culture, value);
	    }

	    /// <summary>
		/// Converts the given value object to the specified type, using the specified context and culture information.
		/// </summary>
		/// <returns>
		/// An <see cref="T:System.Object"></see> that represents the converted value.
		/// </returns>
		/// <param name="culture">A <see cref="T:System.Globalization.CultureInfo"></see>. If null is passed, the current culture is assumed. </param>
		/// <param name="context">An <see cref="T:System.ComponentModel.ITypeDescriptorContext"></see> that provides a format context. </param>
		/// <param name="destinationType">The <see cref="T:System.Type"></see> to convert the value parameter to. </param>
		/// <param name="value">The <see cref="T:System.Object"></see> to convert. </param>
		/// <exception cref="T:System.NotSupportedException">The conversion cannot be performed. </exception>
		/// <exception cref="T:System.ArgumentNullException">The destinationType parameter is null. </exception>
		public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
		{
            if ((destinationType == typeof(String)) && (value is Texture))
                return ((Texture)value).File;

            return base.ConvertTo(context, culture, value, destinationType);
		}
	}
}